问题:输入两个整数a,b,-10100<a, b < 10100, 编程计算a-b。
这是个非常简单的题目,因为a,b可能为正可能为负,所以有a-b, a-(-b), -a-b,-a-(-b)这四种情况。去括号后有a-b,-(a-b), a+b, -(a+b),其中共两种情况。写代码的话仍然比较烦。想到二进制的补码运算可以把减法变成加法从而统一加减运算,于是考虑实现十进制的补码运算。十进制的补码运算以及各种进制的运算(做这个题目时查看TAOCP第二卷时学到了关于任意进制的一些东西,包括b进制和bk进制的转换,尤其是-10进制,sqrt(2)进制等等,非常有趣,附在后面)在网上资料非常多,这里只是记下自己做这个题目的过程,备忘。
二进制的补码运算是非常熟悉的了。(X+Y)补=X补+Y补,(X-Y)补=X补+(-Y)补,这是补码能统一加减运算的公式,对于十进制也是一样。对于任何进制的补码,都有公式:
[X]补=M+X(MOD M)
有了这些,将补码应用于十进制就非常简单。自己当时有些偏执,一定想找两个数放在符号位上,替代二进制中0正1负的作用。因为二进制中,0表示什么都没有,1表示再放一个就会溢出,所以十进制中,用0取代二进制中的0,放在符号位上表示正,用9取代二进制中的1&